import dayjs from 'dayjs'
import relativeTime from 'dayjs/plugin/relativeTime'
import 'dayjs/locale/zh-cn'

// 配置dayjs
dayjs.extend(relativeTime)
dayjs.locale('zh-cn')

/**
 * 格式化日期
 * @param {Date|string|number} date 日期
 * @param {string} format 格式
 * @returns {string}
 */
export function formatDate(date, format = 'YYYY-MM-DD HH:mm:ss') {
  return dayjs(date).format(format)
}

/**
 * 格式化时间（通用函数）
 * @param {Date|string|number} date 日期
 * @param {string} format 格式，默认为相对时间
 * @returns {string}
 */
export function formatTime(date, format = null) {
  if (!date) return ''

  if (format) {
    return dayjs(date).format(format)
  }

  // 默认使用相对时间
  return formatRelativeTime(date)
}

/**
 * 格式化相对时间
 * @param {Date|string|number} date 日期
 * @returns {string}
 */
export function formatRelativeTime(date) {
  const now = dayjs()
  const target = dayjs(date)
  const diff = now.diff(target, 'second')

  if (diff < 60) {
    return '刚刚'
  } else if (diff < 3600) {
    return `${Math.floor(diff / 60)} 分钟前`
  } else if (diff < 86400) {
    return `${Math.floor(diff / 3600)} 小时前`
  } else if (diff < 2592000) {
    return `${Math.floor(diff / 86400)} 天前`
  } else if (diff < 31536000) {
    return `${Math.floor(diff / 2592000)} 个月前`
  } else {
    return `${Math.floor(diff / 31536000)} 年前`
  }
}

/**
 * 格式化距离现在的时间
 * @param {Date|string|number} date 日期
 * @returns {string}
 */
export function formatDistanceToNow(date) {
  return formatRelativeTime(date)
}

/**
 * 格式化智能时间显示
 * @param {Date|string|number} date 日期
 * @returns {string}
 */
export function formatSmartTime(date) {
  const now = dayjs()
  const target = dayjs(date)
  const diff = now.diff(target, 'day')

  if (diff === 0) {
    // 今天
    return target.format('HH:mm')
  } else if (diff === 1) {
    // 昨天
    return `昨天 ${target.format('HH:mm')}`
  } else if (diff < 7) {
    // 一周内
    return `${diff} 天前`
  } else if (now.year() === target.year()) {
    // 今年
    return target.format('MM-DD')
  } else {
    // 其他年份
    return target.format('YYYY-MM-DD')
  }
}

/**
 * 判断是否为今天
 * @param {Date|string|number} date 日期
 * @returns {boolean}
 */
export function isToday(date) {
  return dayjs(date).isSame(dayjs(), 'day')
}

/**
 * 判断是否为昨天
 * @param {Date|string|number} date 日期
 * @returns {boolean}
 */
export function isYesterday(date) {
  return dayjs(date).isSame(dayjs().subtract(1, 'day'), 'day')
}

/**
 * 判断是否为本周
 * @param {Date|string|number} date 日期
 * @returns {boolean}
 */
export function isThisWeek(date) {
  return dayjs(date).isSame(dayjs(), 'week')
}

/**
 * 判断是否为本月
 * @param {Date|string|number} date 日期
 * @returns {boolean}
 */
export function isThisMonth(date) {
  return dayjs(date).isSame(dayjs(), 'month')
}

/**
 * 判断是否为本年
 * @param {Date|string|number} date 日期
 * @returns {boolean}
 */
export function isThisYear(date) {
  return dayjs(date).isSame(dayjs(), 'year')
}

/**
 * 获取时间段描述
 * @param {Date|string|number} startDate 开始日期
 * @param {Date|string|number} endDate 结束日期
 * @returns {string}
 */
export function getTimePeriod(startDate, endDate) {
  const start = dayjs(startDate)
  const end = dayjs(endDate)
  const diff = end.diff(start, 'minute')

  if (diff < 60) {
    return `${diff} 分钟`
  } else if (diff < 1440) {
    return `${Math.floor(diff / 60)} 小时`
  } else {
    return `${Math.floor(diff / 1440)} 天`
  }
}

/**
 * 格式化发布时间
 * @param {Date|string|number} date 日期
 * @returns {string}
 */
export function formatPublishTime(date) {
  const now = dayjs()
  const target = dayjs(date)
  const diff = now.diff(target, 'minute')

  if (diff < 1) {
    return '刚刚'
  } else if (diff < 60) {
    return `${diff} 分钟前`
  } else if (diff < 1440) {
    return `${Math.floor(diff / 60)} 小时前`
  } else if (diff < 10080) { // 7天
    return `${Math.floor(diff / 1440)} 天前`
  } else {
    return target.format('YYYY-MM-DD')
  }
}

/**
 * 获取友好的日期显示
 * @param {Date|string|number} date 日期
 * @returns {string}
 */
export function getFriendlyDate(date) {
  const target = dayjs(date)
  const now = dayjs()

  if (target.isSame(now, 'day')) {
    return '今天'
  } else if (target.isSame(now.subtract(1, 'day'), 'day')) {
    return '昨天'
  } else if (target.isSame(now.add(1, 'day'), 'day')) {
    return '明天'
  } else if (target.isSame(now, 'week')) {
    return target.format('dddd')
  } else if (target.isSame(now, 'year')) {
    return target.format('MM月DD日')
  } else {
    return target.format('YYYY年MM月DD日')
  }
}
